package A爆炸集;

/**
 * @description: CPU缓存行对程序的效率影响
 * @author: gongming
 * @create: 2021-08-26
 **/

public class CacheLineEffect {
    //考虑一般缓存行大小是64字节，一个 long 类型占8字节
    static long[][] arr;

    /**
     * L1 L2 L3 三次缓存 L1CPU间共享,L2L3每个CPU私有
     * 每个缓存L中都有多个缓存行,每个缓存行的通常是64字节(下面程序可以证明)
     * cacheLine是CPU读取内存的最小单位,但CPU从内存中读取数据时会一次性读取64字节的数据,即会将目标周围的数据一起读入,读满缓存行的64字节。
     * 多CPU,就会有伪共享的问题,它会造成缓存行数据失效,使程序执行效率降低。
     */
    public static void main(String[] args) {
        arr = new long[1024 * 1024][];
        for (int i = 0; i < 1024 * 1024; i++) {
            arr[i] = new long[8];
            for (int j = 0; j < 8; j++) {
                arr[i][j] = 0L;
            }
        }
        long sum = 0L;
        long marked = System.currentTimeMillis();
        for (int i = 0; i < 1024 * 1024; i += 1) {
            for (int j = 0; j < 8; j++) {
                sum = arr[i][j];
            }
        }
        System.out.println("Loop times:" + (System.currentTimeMillis() - marked) + "ms");

        marked = System.currentTimeMillis();
        for (int i = 0; i < 8; i += 1) {
            for (int j = 0; j < 1024 * 1024; j++) {
                sum = arr[j][i];
            }
        }
        System.out.println("Loop times:" + (System.currentTimeMillis() - marked) + "ms");
    }
}
